unit ucondicoesconsulta;

interface

uses
  Classes, SysUtils;

const
  CON_OR = ' or ';
  CON_AND = ' and ';

type

  { TCondicaoConsulta }

  // Classe para criar condições para consultas
  TCondicoesConsulta = class
  private
    // Lista de condições
    ListaCondicoes: TStringList;
    // Indica se as condições devem ser concatenadas com OR
    Conectivo: string;
  public
    // Construtor
    constructor Create(ConectivoPadrao: string);
    // Destrutor
    destructor Destroy();
    // Adiciona uma condição com Campo = valor
    procedure Add(Campo: string; Valor: string);
    // Adiciona uma condição com Campo = Campo
    procedure AddCampo(Campo1: string; Campo2: string);
    // Adiciona uma condição com Campo1 = valor1 OP Campo2 = Valor2
    procedure AddDupla(Campo1: string; Valor1: string; Campo2: string;
      Valor2: string; Operador: string);
    // Adiciona uma condição com campo LIKE %valor%
    procedure AddText(Campo: string; Valor: string);
    // Obtém as condições concatenadas
    function GetCondicoes(): string;
    // Obtém o número de condições
    function GetCount(): integer;
  end;

implementation

{ TConcicaoConsulta }

constructor TCondicoesConsulta.Create(ConectivoPadrao: string);
begin
  if (ConectivoPadrao = CON_OR) then
  begin
    self.Conectivo := CON_OR;
  end
  else
  begin
    self.Conectivo := CON_AND;
  end;
  // Inicializa a lista de condições
  ListaCondicoes := TStringList.Create();
end;

destructor TCondicoesConsulta.Destroy();
begin
  // Destroy a lista de condições
  ListaCondicoes.Destroy();
end;

procedure TCondicoesConsulta.Add(Campo: string; Valor: string);
begin
  if (Valor <> '') then
  begin
    Valor := QuotedStr(Valor);
    ListaCondicoes.Add(Campo + ' = ' + Valor);
  end;
end;

procedure TCondicoesConsulta.AddCampo(Campo1: string; Campo2: string);
begin
  if (Campo1 <> '') and (campo2 <> '') then
  begin
    ListaCondicoes.Add(Campo1 + ' = ' + Campo2);
  end;
end;

procedure TCondicoesConsulta.AddDupla(Campo1: string; Valor1: string;
  Campo2: string; Valor2: string; Operador: string);
begin
  if (Valor1 <> '') and (Valor2 <> '') then
  begin
    Valor1 := QuotedStr(Valor1);
    Valor2 := QuotedStr(Valor2);
    ListaCondicoes.Add('(' + Campo1 + ' = ' + Valor1 + Operador +
      Campo2 + ' = ' + Valor2 + ')');
  end;
end;

procedure TCondicoesConsulta.AddText(Campo: string; Valor: string);
begin
  if (Valor <> '') then
  begin
    Valor := '%' + Valor + '%';
    Valor := QuotedStr(Valor);
    ListaCondicoes.Add(Campo + ' LIKE ' + Valor);
  end;
end;

function TCondicoesConsulta.GetCondicoes(): string;
var
  Condicoes: string;
  Cont: integer;
begin
  Condicoes := '';
  if (ListaCondicoes.Count >= 1) then
  begin
    // Inicia com espaço para não juntar com WHERE
    Condicoes := Condicoes + ' ';
    // Concatena a primeira condição
    Condicoes := Condicoes + ListaCondicoes[0];
    // Concatena as demais condições
    for Cont := 1 to ListaCondicoes.Count - 1 do
    begin
      Condicoes := Condicoes + Conectivo + ListaCondicoes[Cont];
    end;
  end;
  GetCondicoes := Condicoes;
end;

function TCondicoesConsulta.GetCount(): integer;
begin
  GetCount := ListaCondicoes.Count;
end;

end.
